package org.example.aop;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @AfterThrowing：
 * 这个注解标记的方法会在目标方法抛出异常时执行。
 * 它可以访问到抛出的异常对象，通过 throwing 属性指定一个变量来接收异常信息。
 * 通常用于异常处理，如记录异常日志、通知系统管理员等。
 * @After：
 * 如前所述，@After 注解的方法会在目标方法无论是否抛出异常，只要执行完毕就会执行。
 * 它不关心方法的返回值或异常情况，只关注方法执行的生命周期结束。
 * 常用于资源清理，因为这是无论方法执行情况如何都需要进行的步骤。
 * @AfterReturning：
 * 这个注解的方法会在目标方法正常执行且没有抛出异常后执行。
 * 它允许访问并可能处理方法的返回值，通过 returning 属性指定一个变量来接收返回值。
 * 适用于需要在方法成功执行后进行某些操作，如验证结果、缓存结果等。
 */
@Component
@Aspect// 让里面的东西实现切面
public class MyAdvice {
    @Pointcut("execution(* org.example.dao.impl..*.*(..))")
//    给该包所有的加增强
//    @Pointcut("execution(* org.example.dao.impl.StudentDaoimpl.Save())")给某个方法进行增强
    private void pointcut(){}

    @Before("pointcut()")
    public void method(){
         System.out.println("Dao前置通知");
    }
    @After("pointcut()")
    public void method2(){
        System.out.println("Dao后置通知");
    }
    @AfterReturning(pointcut = "pointcut()", returning =  "name")
    public void method3(String name){
        System.out.println("Dao返回通知");
    }
    @AfterThrowing("pointcut()")
    public void method4(){
        System.out.println("Dao异常通知");
    }
//    @Around("pointcut()")
//    public Object method3(ProceedingJoinPoint pjp){
//        System.out.println("Dao环绕通知");
//        return null;
//    }
//    @Pointcut("execution(* org.example.service.impl.StudentServiceimpl.Save())")
//    private void pointcut2(){}
//    //指定切入点
//    @Before("pointcut2()")
//    public void method3(){
//        System.out.println("Service前置通知2");
//    }
//    @After("pointcut2()")
//    public void method4(){
//        System.out.println("Service后置通知2");
//    }

//     切入点要执行的方法
}
